home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
xlate09.arc
/
STUB09.TXT
< prev
next >
Wrap
Text File
|
1980-01-01
|
8KB
|
201 lines
********************************************************************
* MC6809 TO MC68000 CONVERSION FRONT END STUB
*
* ***STUB09***
*
* THIS CODE CONTAINS SUBROUTINES THAT SUPPORT THE TRANSLATION
* PROCESS. THEY CAN BE CLASSIFIED INTO 3 AREAS :
* 1) INSTRUCTION SIMULATION
* 2) DATA REGISTER MANIPULATON
* 3) CONDITION CODE CONTROL
* THE TRAN09 PROGRAM WILL REPLACE ANY END STATMENT CONTAINING
* AN ENTRY POINT ADDRESS WITH THE SEQUENCE:
*
* ...START EQU <OLD.END.ENTRY>
* END ...INIT
*
* THIS ALTERS INITIAL CONTROL TO THE CODE BELOW WHICH IS
* REQUIRED TO INITIALIZE THE SYSTEM STACK AND PSUEDO PROGRAM
* STACK BEFORE ACTUALLY ENTERING THE CONVERTED PROGRAM PROPER.
SECTION 0
DS.W 30 USER 68000 CODE STACK FOR STUB USE ETC.
..STACK DS.W 1 STACK UPPER LIMIT
* THE ABOVE STACK IS ONLY USED FOR INTERNAL SUBROUTINE CALLS
* AND POSSIBLE 68000 CODE ADDED BY THE USER. USER ADDED
* CODE MUST REMEMBER THAT SP DOES NOT POINT TO THE CONVERTED
* PROGRAM'S OPERATIVE STACK (S) WHICH INSTEAD IS BASED ON A6.
XDEF ..DIN,..DOUT,..JSR,..RTS,..CTOX,..CREP,..VREP
XDEF ..DPR,..DPW,..CLRAB,..MUL,..INIT
..INIT LEA ..STACK,SP STACK FOR INTERNAL AND USER 68000 CODE USE
* INITIALISE REGISTERS
MOVEQ.L #0,D0 ACCA
MOVEQ.L #0,D1 ACCB
MOVEQ.L #0,D2 ACCD (A+B CONCATENATED WHEN NECESSARY)
MOVEQ.L #0,D3 TEMPORARY REG
MOVEQ.L #0,D4 ADDRESS PASS REGISTER (TO UPDATE CONDITION CODES)
MOVEQ.L #0,D5 CCR TEMP REG
MOVEA.L D0,A0 X
MOVEA.L D0,A1 Y
MOVEA.L D0,A2 PC (LOAD WHEN NEEDED FOR PCR ADDR MODE EMULATION)
MOVEA.L D0,A3 TEMPORARY REGISTER
MOVEA.L D0,A4 DP (BITS 8 TO 15)
MOVEA.L D0,A5 U
MOVEA.L D0,A6 S
JMP ..START(PC) START USER CODE
* A TYPICAL STACK CONFIGURATION MIGHT BE :-
*
* WORDS
* |_________| ..STACK-30
* |_________| ^
* |_________| ! SYSTEM USER STACK (A7)
* ~_________~ !
* |_________| !
* __________|_________|_______ ..STACK
* |_________| ^
* |_________| ! 6809 PSEUDO S STACK (A6)
* ~_________~ !
* |_________| !
* __________|_________|_______ ..STAK09
* |_________| |
* ~_________~ | 6809 GLOBAL VARIABLES (A5)
* |_________| |
* |_________| V
*
* COMMON PRACTICE IS TO USE U AS A STACK MARK TO REFERENCE GLOBAL
* VARIABLES PLACED IN MEMORY HIGHER THAN THE S STACK.
*********************
* SIMULATION ASSIST *
* SUBROUTINES *
*********************
**********
* SET 'X' BIT SAME AS 'C' BIT. CALL BEFORE 68K INSTRUCTIONS WHICH USE THE
* 'X' BIT.
..CTOX MOVE.W (A7)+,SR RESTORE STACK
ORI.B #$10,CCR SETR X BIT
BCS.S ..XOK IF CARRY SET, FINISH
ANDI.B #$EF,CCR ELSE CLEAR X BIT
..XOK RTS RETURN TO CALLER
**********
* JSR CAN ONLY OPERATE WITH A7. TO MAINTAIN COMPATIBLITY WITH 6809 CODE
* THE 6809 PSEUDO S STACK MUST BE UPDATED ACCORDINGLY.
..JSR MOVE.W SR,-(A7) SAVE CCR
MOVE.L 2(A7),-(A6) TRANSFER RETURN ADDRESS TO 6809 S STACK
MOVE.L A3,2(A7) TRANSFER CALL ADDRESS TO SYSTEM STACK
RTR RETURN TO CALLED ROUTINE WITH ORIGINAL CCR
**********
* RTS CAN ONLY OPERATE WITH A7. TO MAINTAIN COMPATIBILITY WITH 6809 CODE
* THE RETURN ADDRESS WILL BE ON THE PSEUDO S STACK AND MUST BE TRANSFERED
* BACK TO THE SYSTEM STACK.
..RTS MOVE.W SR,-(A7) SAVE CCR
MOVE.L (A6)+,2(A7) TRANSFER RETURN ADDRESS TO SYSTEM STACK
RTR RETURN TO CALLING ROUTINE
**********
* PSUEDO ACCD IS REG D2. ACCA (D0) AND ACCB (D1) MUST THEREFORE BE CONCATENATED
* TO FORM ACCD. CALL BEFORE INSTRUCTIONS OPERATING ON ACCD. MUST BE COUPLED
* WITH A CALL TO ..DOUT BEFORE FURTHER ACCA/B OPERATIONS.
..DIN MOVE.W SR,-(A7) SAVE CCR
MOVE.W D0,D2 ACCA TO D LS BYTE
LSL.W #8,D2 MOVE TO MS BYTE, CLEAR D LS BYTE
OR.W D1,D2 ACCB TO D LS BYTE
RTR RETURN & RESTORE CCR
**********
* PSUEDO ACCD IS REG D2. AFTER ACCD OPERATION, D2 MUST BE SPLIT TO FORM THE
* NEW ACCA (D0) AND ACCB (D1).
..DOUT MOVE.W SR,-(A7) SAVE CCR
MOVE.W D2,D1 D TO B
ANDI.W #$00FF,D1 CLEAR MS BYTE
LSR.W #8,D2 MOVE MS BYTE TO LS BYTE, CLEAR MS BYTE
MOVE.W D2,D0 D TO A
RTR
**********
* PSUEDO DP REG IS MS BYTE (FOR EASY CONCATENATION) OF A4.W . BEFORE READING
* DP (I.E. BY EXG OR TFR), IT MUST BE TRANSFERED AND ADJUSTED TO LS BYTE.
* NOTE : CCR SAVE NOT NECESSARY. SUBSEQUENT CODE WILL CORRUPT IT.
..DPR MOVE.W A4,D3 DP TO TEMP
LSR.W #8,D3 SHIFT INTO LS BYTE
AND.L #$000000FF,D3 ENSURE EVERYTHING ELSE IS CLEAR!
RTS
**********
* PSUEDO DP REG IS MS BYTE (FOR EASY CONCATENATION) OF A4. BEFORE WRITING
* DP (I.E. BY EXG OR TFR), IT MUST BE TRANSFERED AND ADJUSTED TO MS BYTE.
* TO AVOID PROBLEMS WITH SIGN EXTENSION, DURING MANIPULATION DP IS CONSIDERED
* AS A4.L .
..DPW MOVE.W SR,-(A7) SAVE CCR
LSL.W #8,D3 SHIFT INTO MS BYTE, CLEAR LS BYTE
* MS WORD SHOULD ALREADY BE CLEAR.
MOVE.L D3,A4 MOVE TEMP TO DP
RTR
**********
* TO SIMULATE MUL, MS BYTE OF RESULT FROM MULU MUST BE MOVED INTO D0 (ACCA)
* AND ADJUSTED. MS BYTE OF D1 (ACCB) SHOULD ALSO BE CLEARED.
..MUL MULU.W D0,D1 A x B TO B
MOVE.W D1,D0 COPY B TO A
LSR.W #8,D0 SHIFT MS BYTE TO LS BYTE OF A, CLEAR MS BYTE
AND.W #$00FF,D1 CLEAR MS BYTE OF B
RTS
**********
* SOME 68K CODE WILL CORRUPT THE MS BYTES OF D0 (ACCA) AND D1 (ACCB). TO
* MAINTAIN INTEGRITY, THESE BYTES SHOULD BE CLEARED. SOME OPERATIONS
* WILL ASSUME THIS TO BE THE CASE (E.G. INSTRUCTIONS AFFECTING ACCA/B
* WHICH DO NOT SUPPORT BYTE SIZE OPERATIONS).
..CLRAB MOVE.W SR,-(A7) SAVE CCR
ANDI.L #$000000FF,D0 CLEAR MS BYTE A
ANDI.L #$000000FF,D1 CLEAR MS BYTE B
RTR
*************************************************************************
*
* OPTIONAL ROUTINES TO CORRECT CLEARING OF THE C AND V BITS
* (SEE USERS GUIDE FOR IMPLIMENTATION). D5 ASSUMED TO CONTAIN OLD CCR.
..CREP ANDI.B #$FE,CCR CLEAR CARRY
MOVE.W SR,-(A7) SAVE CCR
LSR.W #1,D5 OLD C BIT TO C
BCC.S ..CSROK QUIT IF C CLEAR
ORI.B #$01,1(A7) ELSE SET C IN STACKED CCR
..CSROK RTR RETURN AND RESTORE CORRECTED CCR
..VREP ANDI.B #$FD,CCR CLEAR V BIT
MOVE.W SR,-(A7) SAVE CCR
LSR.W #2,D5 OLD V BIT TO C
BCC.S ..VSROK QUIT IF C CLEAR
ORI.B #$02,1(A7) ELSE SET V IN STACKED CCR
..VSROK RTR RETURN AND RESTORE CORRECTED CCR
OPT A,FRS ABSOLUTE EXPRESSIONS AND 16-BIT FORWARDS
*********** END OF CONVERSION FRONT-END CODE***********
..START EQU * DEFAULT ENTRY TO PROGRAM IF NO END STMT OPERAND
END